package com.system.service;

import com.system.entity.RoleMenu;
import com.system.entity.Menu;
import com.baomidou.mybatisplus.extension.service.IService;
import com.system.response.Result;
import com.system.response.menu.MenuDtoResponse;
import com.system.response.vo.RouterVo;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 菜单表 服务类
 * </p>
 *
 * @author zfc
 * @since 2023-04-20
 */
public interface MenuService extends IService<Menu> {

    /**
     * 查询菜单根据用户名
     * 先通过用户名查询所拥有的角色（因为角色绑定的菜单）
     * 然后再通过角色名去查询菜单
     *
     * @return
     */
    Result selectMenuTreeByRoleNames();

    /**
     * 建立菜单
     *
     * @return
     */
    List<RouterVo> buildMenus(List<Menu> menus);

    /**
     * 获取所有菜单
     * @return
     */
    Result getAllMenu();

    /**
     * 获取所有菜单，【管理员】查看菜单列表
     *
     * @return
     */
    List<Menu> getAllMenuTree(MenuDtoResponse menuDtoResponse);

    /**
     * 新增菜单
     *
     * @param menu
     * @return
     */
    boolean addMenu(Menu menu);

    /**
     * 修改菜单
     *
     * @param menu
     * @return
     */
    boolean updateMenu(Menu menu);

    /**
     * 查询菜单通过菜单id，删除状态为0未删除
     *
     * @param id
     * @return
     */
    Menu selectMenuById(Integer id);

    /**
     * 恢复菜单
     * @param menu
     * @return
     */
    boolean recoverMenu(Menu menu);

    /**
     * 彻底删除菜单通过id
     *
     * @param id
     * @return
     */
    boolean completelyDeleteMenuById(Integer id);

    /**
     * 查询菜单通过菜单id，不根据删除状态查询
     *
     * @param id
     * @return
     */
    Menu selectMenuAllById(Integer id);

    /**
     * 检查父菜单有无子菜单
     *
     * @param id
     * @return
     */
    int checkParentMenuHaveChildMenu(Integer id);

    /**
     * 校验菜单名称是否唯一
     *
     * @param menu
     * @return
     */
    boolean checkMenuNameUnique(Menu menu);


    /**
     * 检查父菜单是否存在，通过菜单id
     *
     * @param id
     * @return
     */
    int checkParentMenuExistById(Integer id);




    /**
     * ------------------------------角色 绑定 菜单-----------------------------------------
     */

    /**
     * 查询角色绑定的菜单
     * @param roleId
     * @return
     */
    List<Menu> queryRolesBoundMenus(Integer roleId);

    /**
     * 给角色绑定菜单（可以批量绑定菜单），不能重复绑定
     * @param roleId
     * @param menuIds
     * @return
     */
    boolean roleBoundMenu(Integer roleId, Integer[] menuIds);

    /**
     * 检查该角色是否重复绑定菜单
     * true:代表空
     * false：代表有值
     * @param roleId
     * @param menuIds
     * @return
     */
    boolean checkRoleBoundMenuUnique(Integer roleId,Integer[] menuIds);

    /**
     * 批量删除 角色绑定菜单
     * @param roleId
     * @param menuIds
     * @return
     */
    boolean batchDeleteRoleBoundMenus(Integer roleId,Integer[] menuIds);

    /**
     * 删除角色绑定的菜单 根据角色ID
     * @param roleId
     * @return
     */
    boolean deleteRoleBoundMenusById(Integer roleId);

    /**
     * 检查是否有角色绑定菜单
     * true:不为空
     * false：为空
     * @param rm
     * @return
     */
    boolean checkRoleBoundMenus(RoleMenu rm);
}
